#include "pch.hpp"
#include "Font.hpp"




CharGlyph::CharGlyph(QDomElement glyph, QDir path)
	: Glyph(glyph, path)
{
	if(!glyph.hasAttribute("id"))   BOOSTEXT_THROW(exception("missing 'id' attribute in 'char' element"));
	if(!glyph.hasAttribute("xoff")) BOOSTEXT_THROW(exception("missing 'xoff' attribute in 'char' element"));
	if(!glyph.hasAttribute("yoff")) BOOSTEXT_THROW(exception("missing 'yoff' attribute in 'char' element"));
	if(!glyph.hasAttribute("xadv")) BOOSTEXT_THROW(exception("missing 'xadv' attribute in 'char' element"));
	if(!glyph.hasAttribute("ch"))   BOOSTEXT_THROW(exception("missing 'ch' attribute in 'char' element"));

	m_id   = glyph.attribute("id").toUInt();
	m_off  = int2(glyph.attribute("xoff").toInt(), glyph.attribute("yoff").toInt());
	m_xAdv = glyph.attribute("xadv").toUInt();
	m_chnl = glyph.attribute("ch").toUInt();
}
///////////////////////////////////////////////////////////////////////////////////////////////////

CharGlyph::CharGlyph(int2 pos, intsize2 size, uint16 id, int2 off, uint8 xAdv, uint8 chnl)
	: Glyph(pos, size)
	, m_id(id)
	, m_off(off)
	, m_xAdv(xAdv)
	, m_chnl(chnl)
{}
///////////////////////////////////////////////////////////////////////////////////////////////////

CharGlyph::~CharGlyph()
{}
///////////////////////////////////////////////////////////////////////////////////////////////////

int2 CharGlyph::offset() const
{
	return m_off;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

uint8 CharGlyph::xAdvance() const
{
	return m_xAdv;
}
///////////////////////////////////////////////////////////////////////////////////////////////////




Quad CharGlyph::quad() const
{
	// Create a quad with the given texture coordinates
	// and then shift it by the offset for this character
	Quad q = Glyph::quad();
	q.move(m_off);

	return q;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

QDomElement CharGlyph::domElement(QDomDocument& document) const
{
	QDomElement element = Glyph::domElement(document);
	element.setTagName("char");
	element.setAttribute("id", m_id);
	element.setAttribute("xoff", m_off.x);
	element.setAttribute("yoff", m_off.y);
	element.setAttribute("xadv", m_xAdv);
	element.setAttribute("ch", m_chnl);

	return element;
}
///////////////////////////////////////////////////////////////////////////////////////////////////




KerningPair::KerningPair()
{}
///////////////////////////////////////////////////////////////////////////////////////////////////

KerningPair::KerningPair(QChar left, QChar right,int8 offset)
	: left(left)
	, right(right)
	, offset(offset)
{}
///////////////////////////////////////////////////////////////////////////////////////////////////

KerningPair::KerningPair(QDomElement pair)
{
	if(!pair.hasAttribute("l")) BOOSTEXT_THROW(exception("missing 'l' attribute in 'pair' element"));
	if(!pair.hasAttribute("r")) BOOSTEXT_THROW(exception("missing 'r' attribute in 'pair' element"));
	if(!pair.hasAttribute("xoff")) BOOSTEXT_THROW(exception("missing 'xoff' attribute in 'pair' element"));

	left   = pair.attribute("l").toUInt();
	right  = pair.attribute("r").toUInt();
	offset = pair.attribute("xoff").toInt();
}
///////////////////////////////////////////////////////////////////////////////////////////////////

QDomElement KerningPair::domElement(QDomDocument& document) const
{
	QDomElement element = document.createElement("pair");
	element.setAttribute("l", left.unicode());
	element.setAttribute("r", right.unicode());
	element.setAttribute("xoff", offset);

	return element;
}
///////////////////////////////////////////////////////////////////////////////////////////////////




FontDesc::FontDesc()
{}
///////////////////////////////////////////////////////////////////////////////////////////////////

FontDesc::FontDesc(QDomElement font)
{
	if(!font.hasAttribute("name")) BOOSTEXT_THROW(exception("missing 'name' attribute in 'font' element"));
	if(!font.hasAttribute("size")) BOOSTEXT_THROW(exception("missing 'size' attribute in 'font' element"));
	if(!font.hasAttribute("outline")) BOOSTEXT_THROW(exception("missing 'outline' attribute in 'font' element"));
	if(!font.hasAttribute("bold")) BOOSTEXT_THROW(exception("missing 'bold' attribute in 'font' element"));
	if(!font.hasAttribute("italic")) BOOSTEXT_THROW(exception("missing 'italic' attribute in 'font' element"));

	name = font.attribute("name");
	size = font.attribute("size").toUInt();
	outline = font.attribute("outline").toUInt();
	bold = font.attribute("bold") == "true";
	italic = font.attribute("italic") == "true";
}
///////////////////////////////////////////////////////////////////////////////////////////////////

FontDesc::FontDesc(QString name, uint8 size, uint8 outline, bool bold, bool italic)
	: name(name)
	, size(size)
	, outline(outline)
	, bold(bold)
	, italic(italic)
{}
///////////////////////////////////////////////////////////////////////////////////////////////////

QDomElement FontDesc::domElement(QDomDocument& document) const
{
	QDomElement element = document.createElement("font");
	element.setAttribute("name", name);
	element.setAttribute("size", size);
	element.setAttribute("outline", outline);
	element.setAttribute("bold", bold ? "true" : "false");
	element.setAttribute("italic", italic ? "true" : "false");

	return element;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

bool FontDesc::operator==(const FontDesc& that) const
{
	if(name != that.name)
		return false;

	if(size != that.size)
		return false;

	if(outline != that.outline)
		return false;

	if(bold != that.bold)
		return false;

	if(italic != that.italic)
		return false;

	return true;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

bool FontDesc::operator<(const FontDesc& that) const
{
	if(name < that.name)
		return true;
	else if(name > that.name)
		return false;

	if(size < that.size)
		return true;
	else if(size > that.size)
		return false;

	if(outline < that.outline)
		return true;
	else if(outline > that.outline)
		return false;

	if(bold < that.bold)
		return true;
	else if(bold > that.bold)

	if(italic < that.italic)
		return true;
	else if(italic > that.italic)
		return false;

	return false;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
